home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A).zip / Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A).po / TOOLBOX.S < prev   
Text File  |  1996-12-24  |  6KB  |  173 lines

  1. ***********************************
  2. *                                 *
  3. *   TOOLBOX DISPATCHER (ROM 01)   *
  4. *                                 *
  5. *  Interpreted by Sandy Mossberg  *
  6. *                                 *
  7. *       Merlin-16 Assembler       *
  8. *                                 *
  9. ***********************************
  10.  
  11. SysTPTPtr = $E103C0      ;ptr to System Tool Pointer Table
  12. UserTPTPtr = $E103C4     ;ptr to User Tool Pointer Table
  13. SysWAPTPtr = $E103C8     ;ptr to System Work Area Ptr Table
  14. UserWAPTPtr = $E103CC    ;ptr to User Work Area Ptr Table
  15.  
  16. *-------------------------------
  17. * Toolbox Dispatcher Vectors:
  18. *-------------------------------
  19.           ORG $E10000
  20.  
  21. DISPATCH1 JML SysTLEntry1 ;JSL directly to system dispatcher
  22. DISPATCH2 JML SysTLEntry2 ;JSL to JSL to system dispatcher
  23. UDISPATCH1 JML UserTLEntry1 ;JSL directly to user dispatcher
  24. UDISPATCH2 JML UserTLEntry2 ;JSL to JSL to user dispatcher
  25.  
  26. *-------------------------------
  27. * Toolbox Dispatcher Code:
  28. *-------------------------------
  29.           ORG $FE0069
  30.  
  31. * USER DISPATCHER:
  32.  
  33. *--> Type 2 User Dispatcher (JSL to JSL UDISPATCH2 comes here):
  34.  
  35. UserTLEntry2 REP %00110000 ;set full 16-bit mode
  36.           TSC            ;get entry SP
  37.           SEC
  38.           SBC #$0007     ;subtract 7 from SP
  39.           TCS            ;reset SP
  40.           PHD            ;save entry DP on stack
  41.           TCD            ;equate DP to current SP
  42.           BRA UserTLEntry
  43.  
  44. *--> Type 1 User Dispatcher (JSL UDISPATCH1 comes here):
  45.  
  46. UserTLEntry1 REP %00110000 ;set full 16-bit mode
  47.           TSC            ;get entry SP
  48.           SEC
  49.           SBC #$000A     ;subtract 10 from SP
  50.           TCS            ;reset SP
  51.           PHD            ;save entry DP on stack
  52.           TCD            ;equate DP to current SP
  53.           LDA #TLRTL-1   ;place 3-byte address
  54.           STA $08        ; of RTL-1 instruction
  55.           LDA #>TLRTL-1  ; on stack/in DP
  56.           STA $09        ; ($08-$0A)
  57.  
  58. *--> Common User Dispatcher:
  59.  
  60. UserTLEntry LDAL UserTPTPtr ;place 3-byte address
  61.           STA $05        ; of user TPT
  62.           LDAL UserTPTPtr+1 ; on stack/in DP
  63.           STA $06        ; ($05-$07)
  64.           LDAL UserWAPTPtr ;place 4-byte address
  65.           STA $01        ; of user WAPT
  66.           LDAL UserWAPTPtr+2 ; on stack/in DP
  67.           STA $03        ; ($01-$04)
  68.           BRA TLEntry
  69.  
  70. * SYSTEM DISPATCHER:
  71.  
  72. *--> Type 2 System Dispatcher (JSL to JSL DISPATCH2 comes here):
  73.  
  74. SysTLEntry2 REP %00110000 ;set full 16-bit mode
  75.           TSC            ;get entry SP
  76.           SEC
  77.           SBC #$0007     ;subtract 7 from SP
  78.           TCS            ;reset SP
  79.           PHD            ;save entry DP on stack
  80.           TCD            ;equate DP to current SP
  81.           BRA SysTLEntry
  82.  
  83. *--> Type 1 System Dispatcher (JSL DISPATCH1 comes here):
  84.  
  85. SysTLEntry1 REP %00110000 ;set full 16-bit mode
  86.           TSC            ;get entry SP
  87.           SEC
  88.           SBC #$000A     ;subtract 10 from SP
  89.           TCS            ;reset SP
  90.           PHD            ;save entry DP on stack
  91.           TCD            ;equate DP to current SP
  92.           LDA #TLRTL-1   ;place 3-byte address
  93.           STA $08        ; of RTL-1 instruction
  94.           LDA #>TLRTL-1  ; on stack/in DP
  95.           STA $09        ; ($08-$0A)
  96.  
  97. *--> Common System Dispatcher:
  98.  
  99. SysTLEntry LDAL SysTPTPtr ;place 3-byte address
  100.           STA $05        ; of system TPT
  101.           LDAL SysTPTPtr+1 ; on stack/in DP
  102.           STA $06        ; ($05-$07)
  103.           LDAL SysWAPTPtr ;place 4-byte address
  104.           STA $01        ; of system WAPT
  105.           LDAL SysWAPTPtr+2 ; on stack/in DP
  106.           STA $03        ; ($01-$04)
  107.  
  108. * COMMON DISPATCHER:
  109.  
  110. TLEntry   TXA            ;entry X-reg = function #/tool set #
  111.           PHA            ;save entry X-reg on stack
  112.           AND #$00FF     ;isolate tool set byte
  113.           BEQ ToolSetErr ;error (tool set number too small)
  114.           CMP [$05]      ;check number of tool sets in TPT
  115.           BCS ToolSetErr ;error (tool set number too large)
  116.           ASL            ;quadruple tool set number to index
  117.           ASL            ; TPT and WAPT 4-byte entries
  118.           TAY            ;Y-reg indexes table entry
  119.           LDA [$01],Y    ;get lo order bytes in WAPT (ML,LL)
  120.           TAX            ; and save in X-reg
  121.           INY            ;point at hi order
  122.           INY            ; bytes in WAPT
  123.           LDA [$01],Y    ;get hi order bytes in WAPT (HH,MH)
  124.           STA $03        ;reset $01-$04 to point
  125.           STX $01        ; at work area
  126.           DEY            ;point at mid order bytes in TPT
  127.           LDA [$05],Y    ;get mid order bytes in TPT (MH,ML)
  128.           TAX            ; and save in X-reg
  129.           DEY            ;point at lo order bytes in TPT
  130.           LDA [$05],Y    ;get lo order bytes in TPT (ML,LL)
  131.           STA $05        ;reset $05-$07 to
  132.           STX $06        ; point at FPT
  133.           LDA $02,S      ;isolate function
  134.           AND #$00FF     ; number byte
  135.           BEQ ToolFunctErr ;error (function number too small)
  136.           CMP [$05]      ;check number of functions in FPT
  137.           BCS ToolFunctErr ;error (function number too large)
  138.           ASL            ;quadruple function number to
  139.           ASL            ; index FPT 4-byte entries
  140.           TAY            ;Y-reg indexes FPT entry
  141.           LDA [$05],Y    ;get lo order bytes in
  142.           TAX            ; FPT (ML,LL) into X-reg
  143.           INY            ;point at and get mid order
  144.           LDA [$05],Y    ; bytes in FPT (MH,ML)
  145.           STA $06        ;reset $05-$07 to point
  146.           STX $05        ; at function handler-1
  147.  
  148. * NORMAL RETURN FROM DISPATCHER:
  149.  
  150.           PLX            ;X-reg = function #/tool set #
  151.           PLD            ;restore entry direct page
  152.           PLA            ;A-reg = lo order WAPT address
  153.           PLY            ;Y-reg = hi order WAPT address
  154.           RTL            ;funny jump to function handler
  155.  
  156. * ERROR RETURN FROM DISPATCHER:
  157.  
  158. ToolSetErr LDX #$0001    ;signal toolNotFoundErr
  159.           BRA ToolErr
  160.  
  161. ToolFunctErr LDX #$0002  ;signal funcNotFoundErr
  162.  
  163. ToolErr   PLA            ;discard entry X-reg
  164.           PLD            ;restore entry direct page
  165.           TSC            ;return SP
  166.           CLC            ; to entry
  167.           ADC #$000A     ; value by
  168.           TCS            ; adding 10
  169.           TXA            ;A-reg = error code
  170.           SEC            ;signal error
  171. TLRTL     RTL            ;return to caller
  172.           LST OFF
  173.